/**
 * @function 从对象中筛选出指定键的属性，并返回一个新对象。
 * @author LinHan
 * @param obj 需要从中筛选属性的对象。
 * @param keys 需要筛选出来的键的数组。
 * @returns 返回一个新对象，它只包含 `keys` 数组中指定的键及其对应的值。
 */
export const pick = <T, K extends keyof T>(
  obj: T,
  keys: K[]
): Pick<T, K> => {
  return keys.reduce((acc, curr) => {
    if (Object.prototype.hasOwnProperty.call(obj, curr)) {
      acc[curr] = obj[curr];
    }
    return acc;
  }, {} as Pick<T, K>);
};

/**
 * @function 从对象中筛选出除了指定键以外的所有属性，并返回一个新对象。
 * @author LinHan
 * @param obj 需要从中筛选属性的对象。
 */
export const omit = <T, K extends keyof T>(
  obj: T,
  keys: K[]
): Omit<T, K> => {
  return Object.keys(obj).reduce((acc, curr) => {
    if (!keys.includes(curr as K)) {
      acc[curr] = obj[curr];
    }
    return acc;
  }, {} as Omit<T, K>);
};

